<<<<<<< .mine
package su.fishr.effects.flySquares 
{
	import flash.display.DisplayObject;
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.IEventDispatcher;
	import flash.events.TimerEvent;
	import flash.geom.Rectangle;
	import flash.utils.Timer;
	import su.fishr.effects.FlySquares;
	
	/**
	 *   Контроллер приложения.
	 * - принимает аргументы от фасада FlySquares(),
	 * - сигналы о состоянии приложения,
	 * - контролирует, обрабатывает запросы к модели (MFlySquares)
	 * - сигналы от view (VFlySquares...).
	 * 
	 * @private
	 * @author fish_r
	 */
	public class CFlySquares extends EventDispatcher 
	{
		
	/**-------------------------------------------------------------------------------
	* 
	* 	
	* 
	*						V A R I A B L E ' S 	
	*
	* 
	* 
	* ------------------------------------------------------------------------------
	*/
		public const END_PLAY_THIS:String = "endPlayThis";
		
		private const LENGTH:uint = 100;
		
		private var _frontParent:FlySquares;
		private var _vFlySquares:VFlySquares;
		private var _mFlySquares:MFlySquares;
		private var _sizeFragments:uint;
		private var _addColoumn:uint;
		private var _tick:uint;
		private var _ratio:Number;
		private var _progress:int;
        private var _dObject:DisplayObject;
		private var _postEffect:Boolean;
		private var _rate:Number;
		private var _vertical:Boolean;
		private var _timePause:Timer;
		private var _input:uint;
		private var _shiftObject:Rectangle;
		private var _onBomb:Boolean = false;
		private var _distance:uint;
		
	
	/**-------------------------------------------------------------------------------
	* 
	* 	
	* 
	*						P R O P E R T I E S 	
	*
	* 
	* 
	* --------------------------------------------------------------------------------
	*/
		public function get vFlySquares():DisplayObject 
		{
			return _vFlySquares; 
		}
		
		public function get progress():uint
		{
			return _input;
		}
		public function set progress(nm:uint):void
		{
			_input = nm;
			if ( _timePause.running === false && _onBomb === false ) _timePause.start();
			
		}
		
		
		
		public function get postEffect():Boolean 
		{
			return _postEffect;
		}
		
		public function set postEffect(value:Boolean):void 
		{
			_postEffect = value;
		}
		
		public function get sizeFragments():uint 
		{
			return _sizeFragments;
		}
		
		public function set sizeFragments(value:uint):void 
		{
			var min:Number = Math.min(_dObject.width, _dObject.height);
			if ( _sizeFragments > min ) _sizeFragments = min;
			if ( value < 1 ) value = 1;
			_sizeFragments = value;
		}
		
		public function set rate(value:Number):void 
		{
			if ( value < 0 ) return;
			_vFlySquares.rate = value;
		}
		
		public function get vertical():Boolean 
		{
			return _vertical;
		}
		
		public function set vertical(value:Boolean):void 
		{
			_vertical = value;
		}
		
		public function set blackOff(value:Boolean):void
		{
			_vFlySquares.blackOff = value;
		}
		
		/**
		 *   Сюда из фасада загружаются данные по
		 * фильтрам.
		 *  [0] - вероятность наложения (число от 0 до 1),
		 *  [1] - пассивная фаза,
		 *  [2] - конечная фаза,
		 *  [3] - начальная фаза 
		 */
		public function set arrayFilters(value:Array):void
		{
			if ( !value ) return;
			if ( value[0] > 1 ) value[0] = 1;
			_vFlySquares.stepsFilters = value;
		}
		
		public function get dObject():DisplayObject 
		{
			return _dObject;
		}
		
		/**
		 *  Хранит смещение объекта относительно
		 * внутренней системы координат. Актуально
		 * для переданных объектов с измененной
		 * матрицей. Передается из модели
		 * после опеределения смещения. Хранит-
		 * ся в фасаде (FlySquares())
		 */
		public function get shiftObject():Rectangle 
		{
			return _shiftObject;
		}
		
		public function set onBomb(value:Array):void 
		{
			if ( !value ) return;
			_onBomb = true;
			_vFlySquares.propBomb = value;
			_mFlySquares.bomb = true;
		}
		
		
	/**-------------------------------------------------------------------------------
	* 
	* 	
	* 
	*					C O N S T R U C T O R 	
	*
	* 
	* 
	* --------------------------------------------------------------------------------
	*/
		public function CFlySquares(obj:DisplayObject, size:uint, parent:FlySquares, distance:uint, shift:Rectangle, target:IEventDispatcher = null) 
		{
			_dObject = obj;
			this.sizeFragments = size;
			_frontParent = parent;
			_distance = distance;
			_shiftObject = shift;
			super(target);
			init();
			
		}
		
	/**-------------------------------------------------------------------------------
	* 
	* 	
	* 
	*						P U B L I C 	
	*
	* 
	* 
	* --------------------------------------------------------------------------------
	*/
		
	
		public function endPlayDispatch():void
		{
			_progress = 0;
			_timePause.stop();
			_timePause.removeEventListener(TimerEvent.TIMER, timePauseListener);
			_dObject = null;
			_mFlySquares.disposeAll();
			dispatchEvent( new Event (END_PLAY_THIS) );
		}
		
		

	
	/**-------------------------------------------------------------------------------
	* 
	* 	
	* 
	*						P R I V A T E 	
	*
	* 
	* 
	* --------------------------------------------------------------------------------
	*/
		private function init():void 
		{
			
			_mFlySquares = new MFlySquares(_dObject, _distance, _shiftObject);
			if ( _frontParent.strictMode ) _vFlySquares = new VFlySquaresStrict(_mFlySquares);
			else _vFlySquares = new VFlySquares( _mFlySquares );
			
			_vFlySquares.cFlySquares = this;
			_vFlySquares.addEventListener(Event.ADDED_TO_STAGE, startListener);
			_dObject = _mFlySquares.dObject;
			/// таймер по срабатыванию которого набавляется входящий процент
			_timePause = new Timer(20);
			_timePause.addEventListener(TimerEvent.TIMER, timePauseListener);
			_vFlySquares.addEventListener( _vFlySquares.END_BOMB, endOffBombListener);
			
		}
		
		private function startListener(e:Event):void 
		{
			_vFlySquares.removeEventListener(Event.ADDED_TO_STAGE, startListener);
			_vFlySquares.blackOff = _frontParent.blackOff;
			_mFlySquares.addEventListener( _mFlySquares.SELECT_SIZE, nowCountColomnListener);
			_mFlySquares.numSectors = _sizeFragments;
			_mFlySquares.vertical = _vertical;
			_mFlySquares.init();
			
		}
		
		private function nowCountColomnListener(e:Event):void 
		{
			_sizeFragments = _mFlySquares.numSectors;
			_shiftObject = _mFlySquares.rectShift;
			_ratio = _sizeFragments / LENGTH ;
			this.progress = this.progress;

		}

		
		private function timePauseListener(e:TimerEvent):void 
		{
			_progress ++;
			
			if ( _progress > _input  )
			{
				_progress --;
				_timePause.reset();
				return;
			}
			
			
			var countColoumn:int = _progress * _ratio;
			_addColoumn = countColoumn - _tick;
			
		
			if ( _progress === 100 && _addColoumn === 0 )
			{
				_addColoumn = 1;
			}
			
			///TODO Дублирование контроля входящего процента и наличия каэффициента
			if ( _addColoumn < 1 || _progress > 100 || isNaN(_ratio)) return;
			
			_tick = countColoumn;

			_mFlySquares.addColoumn = _addColoumn;
			
		}
		
		private function endOffBombListener(e:Event):void
		{
			_onBomb = false;
			if ( _timePause.running === false ) _timePause.start();
		}



		
		
		
	}

}=======
package su.fishr.effects.flySquares 
{
	import flash.display.DisplayObject;
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.IEventDispatcher;
	import flash.events.TimerEvent;
	import flash.geom.Rectangle;
	import flash.utils.Timer;
	import su.fishr.effects.FlySquares;
	
	/**
	 *   Контроллер приложения.
	 * - принимает аргументы от фасада FlySquares(),
	 * - сигналы о состоянии приложения,
	 * - контролирует, обрабатывает запросы к модели (MFlySquares)
	 * - сигналы от view (VFlySquares...).
	 * 
	 * @private
	 * @author fish_r
	 */
	public class CFlySquares extends EventDispatcher 
	{
		
	/**-------------------------------------------------------------------------------
	* 
	* 	
	* 
	*						V A R I A B L E ' S 	
	*
	* 
	* 
	* ------------------------------------------------------------------------------
	*/
		public const END_PLAY_THIS:String = "endPlayThis";
		
		private const LENGTH:uint = 100;
		
		private var _frontParent:FlySquares;
		private var _vFlySquares:VFlySquares;
		private var _mFlySquares:MFlySquares;
		private var _sizeFragments:uint;
		private var _addColoumn:uint;
		private var _tick:uint;
		private var _ratio:Number;
		private var _progress:int;
        private var _dObject:DisplayObject;
		private var _vertical:Boolean;
		private var _timePause:Timer;
		private var _input:uint;
		private var _shiftObject:Rectangle;
		private var _onBomb:Boolean = false;
		private var _distance:uint;
		
	
	/**-------------------------------------------------------------------------------
	* 
	* 	
	* 
	*						P R O P E R T I E S 	
	*
	* 
	* 
	* --------------------------------------------------------------------------------
	*/
		public function get vFlySquares():DisplayObject 
		{
			return _vFlySquares; 
		}
		
		public function get progress():uint
		{
			return _input;
		}
		public function set progress(nm:uint):void
		{
			_input = nm;
			if ( _timePause.running === false && _onBomb === false ) _timePause.start();
			
		}
	
		public function get sizeFragments():uint 
		{
			return _sizeFragments;
		}
		
		public function set sizeFragments(value:uint):void 
		{
			var min:Number = Math.min(_dObject.width, _dObject.height);
			if ( _sizeFragments > min ) _sizeFragments = min;
			if ( value < 1 ) value = 1;
			_sizeFragments = value;
		}
		
		public function set rate(value:Number):void 
		{
			if ( value < 0 ) return;
			_vFlySquares.rate = value;
		}
		
		public function get vertical():Boolean 
		{
			return _vertical;
		}
		
		public function set vertical(value:Boolean):void 
		{
			_vertical = value;
		}
		
		public function set blackOff(value:Boolean):void
		{
			_vFlySquares.blackOff = value;
		}
		
		public function get dObject():DisplayObject 
		{
			return _dObject;
		}
		
		/**
		 *  Хранит смещение объекта относительно
		 * внутренней системы координат. Актуально
		 * для переданных объектов с измененной
		 * матрицей. Передается из модели
		 * после опеределения смещения. Хранит-
		 * ся в фасаде (FlySquares())
		 */
		public function get shiftObject():Rectangle 
		{
			return _shiftObject;
		}
		
		public function set onBomb(value:Array):void 
		{
			if ( !value ) return;
			_onBomb = true;
			_vFlySquares.propBomb = value;
			_mFlySquares.bomb = true;
		}
		
		
	/**-------------------------------------------------------------------------------
	* 
	* 	
	* 
	*					C O N S T R U C T O R 	
	*
	* 
	* 
	* --------------------------------------------------------------------------------
	*/
		public function CFlySquares(obj:DisplayObject, size:uint, parent:FlySquares, distance:uint, shift:Rectangle, target:IEventDispatcher = null) 
		{
			_dObject = obj;
			this.sizeFragments = size;
			_frontParent = parent;
			_distance = distance;
			_shiftObject = shift;
			super(target);
			init();
			
		}
		
	/**-------------------------------------------------------------------------------
	* 
	* 	
	* 
	*						P U B L I C 	
	*
	* 
	* 
	* --------------------------------------------------------------------------------
	*/
		
	
		public function endPlayDispatch():void
		{
			
			_progress = 0;
			_timePause.stop();
			_timePause.removeEventListener(TimerEvent.TIMER, timePauseListener);
			_dObject = null;
			_mFlySquares.disposeAll();
			this.dispatchEvent( new Event (END_PLAY_THIS) );
		}
		
		

	
	/**-------------------------------------------------------------------------------
	* 
	* 	
	* 
	*						P R I V A T E 	
	*
	* 
	* 
	* --------------------------------------------------------------------------------
	*/
		private function init():void 
		{
			
			_mFlySquares = new MFlySquares(_dObject, _distance, _shiftObject);
			if ( _frontParent.strictMode ) _vFlySquares = new VFlySquaresStrict(_mFlySquares);
			else _vFlySquares = new VFlySquares( _mFlySquares );
			
			_vFlySquares.cFlySquares = this;
			_vFlySquares.addEventListener(Event.ADDED_TO_STAGE, startListener);
			_dObject = _mFlySquares.dObject;
			/// таймер по срабатыванию которого набавляется входящий процент
			_timePause = new Timer(20);
			_timePause.addEventListener(TimerEvent.TIMER, timePauseListener);
			_vFlySquares.addEventListener( _vFlySquares.END_BOMB, endOffBombListener);
			
		}
		
		private function startListener(e:Event):void 
		{
			_vFlySquares.removeEventListener(Event.ADDED_TO_STAGE, startListener);
			_vFlySquares.blackOff = _frontParent.blackOff;
			_mFlySquares.addEventListener( _mFlySquares.SELECT_SIZE, nowCountColomnListener);
			_mFlySquares.numSectors = _sizeFragments;
			_mFlySquares.vertical = _vertical;
			_mFlySquares.init();
			
		}
		
		private function nowCountColomnListener(e:Event):void 
		{
			_sizeFragments = _mFlySquares.numSectors;
			_shiftObject = _mFlySquares.rectShift;
			_ratio = _sizeFragments / LENGTH ;
			this.progress = this.progress;

		}

		
		private function timePauseListener(e:TimerEvent):void 
		{
			_progress ++;
			
			if ( _progress > _input  )
			{
				_progress --;
				_timePause.reset();
				return;
			}
			
			
			var countColoumn:int = _progress * _ratio;
			_addColoumn = countColoumn - _tick;
			
		
			if ( _progress === 100 && _addColoumn === 0 )
			{
				_addColoumn = 1;
			}
			
			///TODO Дублирование контроля входящего процента и наличия каэффициента
			if ( _addColoumn < 1 || _progress > 100 || isNaN(_ratio)) return;
			
			_tick = countColoumn;

			_mFlySquares.addColoumn = _addColoumn;
			
		}
		
		private function endOffBombListener(e:Event):void
		{
			_onBomb = false;
			if ( _timePause.running === false ) _timePause.start();
		}



		
		
		
	}

}>>>>>>> .r1349
